const http = require("http");
const Koa = require("koa");
const Router = require("koa-router");
const router = new Router();
const app = new Koa();


// session key，签名用
app.keys = ["\sessionkey"];

// 引入路由列表
let routes = require("./router/routes");

// 静态资源路径，开发接口并不需要 static，但是可能会上传文件
let static = require('koa-static');
app.use(static(__dirname + '/public'));

// 引入自定义的错误处理中间件，处理 404、500
let error = require("./utils/midware/error");
app.use(error);

// 挂载在 context 上的快捷方法：log，可以将日志写入数据库
let daoLog = require("./dao/log");
app.context.log = function(key = "untitled log", value = "") {
  daoLog.add({
    key,
    value
  });
};

// 存储 session
let session = require("koa-generic-session");
app.use(session(require("./config/session")));

// 引入自定义的用户认证中间件，处理需要鉴权的用户列表
let auth = require("./utils/midware/auth");
app.use(auth);

// 文件上传的支持
const maxSize = 300 * 1024 * 1024
let body = require("koa-body");
app.use(body({
  multipart: true,
  formidable: {
    keepExtensions: true,
    hash: 'md5',
    maxFieldsSize: maxSize,
    onFileBegin: (name, file) => {
      //console.log(`name: ${file.name}`)
      //console.log(file)
    },
    onError: err => {
      console.log(err);
    }
  }
}));

// 跨域控制的支持
let cors = require("koa2-cors");
app.use(
  cors({
    origin: function(ctx) {
      return "*"; // 允许来自所有域名请求,上线后请注意配置
    },
    credentials: true,
    allowMethods: ["GET", "POST", "PUT", "DELETE"]
  })
);

//解析请求体
let bodyparser = require('koa-bodyparser');
app.use(bodyparser());

// 把 router 做为参数传递给 routes 使用，以便函数内部 use
routes(router);

// 路由注册到 app
app.use(router.routes()).use(router.allowedMethods());

// 设置 proxy 为 true,那么就可以在请求里拿到实际 IP
app.proxy = true;

let port = process.env.PORT || 8000;
const server = http.createServer(app.callback()).listen(port);

// HTTPS配置
// let options = {
//   key: fs.readFileSync('/Users/leiquan/key/privkey.pem'),
//   cert: fs.readFileSync('/Users/leiquan/key/cert.pem')
// };
// https.createServer(options, app.callback()).listen(port);
